﻿import base = require('./base');
import aop = require('./aop');
import express = require('express');

/**
 * 全局服务列表
 */
export class globalServices {

};

const moduleName = "kf.server";
/**
 * 服务信息: 包含服务名称和服务对象的信息
 */
@aop.addon("服务信息",
    "包含服务名称和服务对象的信息",
    moduleName)
export class serviceInfo {
    constructor(public serviceName: string
        , public serviceObject: aop.baseObject) {

    }
}
/**
 * 注册服务列表
 * @param serviceInfos 服务信息列表
 */
export function registerServices(...serviceInfos: serviceInfo[]) {
    for (var serviceInfo of serviceInfos) {
        registerService(serviceInfo);
    }
}
/**
 * 注册服务
 * @param serviceInfo 服务信息
 */
export function registerService(serviceInfo: serviceInfo) {
    if (!globalServices[serviceInfo.serviceName]) {
        globalServices[serviceInfo.serviceName] = serviceInfo.serviceObject;
    }
}

/**
 * 请求
 * @param remoteRequest 远程请求
 * @returns 远程调用方法的结果
 */
export function request(request: base.remoteRequest): any {
    let service = globalServices[request.serviceName];
    if (!service)
        throw new Error(`远程调用服务${request.serviceName}异常，服务找不到。`);

    let serviceFunc = service[request.functionName];
    if (!serviceFunc)
        throw new Error(`远程调用服务${request.serviceName}异常，方法${request.functionName}找不到。`);

    return serviceFunc(request.args);
};

/**
 * 远程调用
 * @param req 请求
 * @param res 响应
 */
export function remoteCall(req: express.Request, res: express.Response) {
    let result = request(req.body);
    res.write(result);
    res.end();
};

/**
 * 应用类
 */
@aop.addon("应用设置", "包含各种资源的主应用实体对象", moduleName)
export class serverAppSetting extends aop.appSetting {
    /**
     * 服务列表
     */
    servics: serviceInfo[];
}